﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace _00_HTTP通讯示例
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Task.Run(async () => 
            {
                //HttpClientHandler类是HttpClient的一个处理程序类，用于处理HTTP请求和响应的相关操作。用与配置HttpClient的行为。
                //AutomaticDecompression属性用于获取或设置是否为HTTP相应的内容自动解压缩。它是一个枚举类型，表示支持的解压缩方法。
                //DecompressionMethods.GZip:表示支持GZip压缩格式的解压缩。
                //DecompressionMethods.Deflate:表示支持Deflate压缩格式的解压缩。
                var clientHandler = new HttpClientHandler
                {
                    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate,
                };
                //HttpClient类是用于发送HTTP请求和接收HTTP响应的类。它提供了一个简单的API来与Web服务进行交互。
                var client = new HttpClient(clientHandler);
                //HttpRequestMessage类表示一个HTTP请求消息。它包含请求的相关信息，如请求方法、请求URI、请求头和请求内容等。
                //Method属性用于获取或设置HTTP请求方法: POST(提交表单), PUT(修改表单), GET(请求数据), DELETE(删除数据)
                //RequestUri属性用于获取或设置请求的URI
                //Headers属性用于获取HTTP请求的标头,标头是HTTP请求和响应的一部分
                //accept : 指定客户端能够接收的内容类型
                //Accept : 指定客户端能够接收的内容类型
                //User-Agent : 指定客户端的名称和版本
                //Connection : 指定与请求/响应相关联的连接是否保持打开状态
                var request = new HttpRequestMessage
                {
                    Method = HttpMethod.Get,
                    RequestUri = new Uri("http://cjh1.ddnsto.net:7221/GetUser"),
                    Headers =
                                    {
                                        { "accept", "*/*" },
                                        { "Accept", "*/*" },
                                        { "User-Agent", "PostmanRuntime-ApipostRuntime/1.1.0" },
                                        { "Connection", "keep-alive" },
                                    },
                };
                //SendAsync 方法用于异步发送HTTP请求并接收HTTP响应。它返回一个Task<HttpResponseMessage>对象，表示异步操作的结果。
                //HttpResponseMessage类表示HTTP响应消息。它包含响应的相关信息，如状态码、响应头和响应内容等。
                using (var response = await client.SendAsync(request))
                {
                    //EnsureSuccessStatusCode 方法用于确保HTTP响应的状态码表示成功。如果状态码表示失败，则抛出异常。
                    //200 OK:表示请求成功，服务器返回了请求的资源。
                    //400 Bad Request:表示请求无效，服务器无法理解请求的语法。
                    //401 Unauthorized:表示请求未经授权，服务器要求提供身份验证凭据。
                    //404 Not Found:表示请求的资源不存在，服务器无法找到请求的URI。
                    //500 Internal Server Error:表示服务器遇到意外情况，无法完成请求。
                    response.EnsureSuccessStatusCode();
                    var body = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(body);
                }
            });


            Console.Read();
        }
    }
}
